// 25.K个一组翻转链表
package LeetcodeHot100;

public class Solution025 {
    public ListNode reverseKGroup(ListNode head, int k) {
        // 获取链表长度
        ListNode node = head;
        int length = 0;
        while (node != null) {
            node = node.next;
            length++;
        }
        // 计算翻转链表的次数
        int times = length / k;
        // 开始翻转链表
        ListNode pre = new ListNode(0);
        ListNode result = pre;
        while (times-- != 0) {
            // 对每组的K个结点使用头插法翻转结点
            for (int i = 0; i < k; i++) {
                ListNode next = head.next;
                head.next = pre.next;
                pre.next = head;
                head = next;
            }
            // 移动指针
            for (int i = 0; i < k; i++) {
                pre = pre.next;
            }
        }
        // 加入最后的结点
        pre.next = head;
        // 返回结果
        return result.next;
    }
}
